﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using IntraVision.Web;
using IntraVision.Web.Security;
using Model;

/// <summary>
/// Summary description for SchedulePeriodController
/// </summary>
public class SchedulePeriodController : EntityListController<SchedulePeriod,NotarialServiceDataContext>
{
    int ScheduleId = 0;

    public SchedulePeriodController()
    {
        ViewData["whitebg"] = true;
        LayoutPath = "~/views/layouts/popup.haml";
        RegisterStylesheet("schedule/schedule.css");
    }
    
    protected override void EntityLoaded(NotarialServiceDataContext dc, SchedulePeriod entity)
    {
        //Дополнительная проверка нужна, т.к. мы не должны выполнять этот метод, если мы вернулись на эту карточку после попытки сохранения.
        if (entity.Id == 0 && entity.Schedule == null)
        {
            if (!Int32.TryParse(Request["scheduleid"], out ScheduleId))
                ViewData.Exceptions.Add(new Exception("Идентификатор расписания не задан! Создание невозможно."));

            DateTime date = DateTime.Now;
            DateTime.TryParse(Request["date"], out date);

            entity.DateStart = date;
            entity.ScheduleId = ScheduleId;
            entity.Schedule = dc.Schedules.SingleOrDefault(s => s.Id == ScheduleId);

            if (entity.Schedule == null)
                ViewData.Exceptions.Add(new Exception("Идентификатор расписания не задан! Создание невозможно."));
            else
                entity.Name = entity.Schedule.Name + " с " + entity.DateStart.ToDateString();

            entity.TypeId = 1;
            //Создадим 7 дней для корректного подсчета числа дней
            for (int i = 0; i < 7; i++)
                entity.ScheduleDays.Add(new ScheduleDay() { Day = i });
        }
    }

    protected override void BeforeSubmit(NotarialServiceDataContext dc, SchedulePeriod entity)
    {
        int days = 0;
        Int32.TryParse(Request["days"], out days);

        while (entity.ScheduleDays.Count < days)
            entity.ScheduleDays.Add(new ScheduleDay());
        while (entity.ScheduleDays.Count > days)
            entity.ScheduleDays.RemoveAt(entity.ScheduleDays.Count - 1);

        bool valid = false;
        for (int i = 0; i < days; i++)
        {
            var sd = entity.ScheduleDays[i];
            sd.Day = i;
            if (!string.IsNullOrEmpty(Request["day" + i]))
            {
                sd.TimeStart = DateTime.Today.ParseTime(Request["timestart" + i]);
                sd.TimeEnd = DateTime.Today.ParseTime(Request["timeend" + i]);
                sd.BreakStart = DateTime.Today.ParseTime(Request["breakstart" + i]);
                sd.BreakEnd = DateTime.Today.ParseTime(Request["breakend" + i]);
                valid = true;
            }
            else
            {
                sd.TimeStart = null; sd.TimeEnd = null; sd.BreakStart = null; sd.BreakEnd = null;
            }
        }

        if (!valid) throw new Exception("Хотя бы один день в неделе должен быть рабочим. Иначе нет смысла создавать расписание.");
    }    
}
